package config

import (
	"errors"
	"fmt"
	"os"
	"path/filepath"
	"strconv"

	"github.com/joho/godotenv"
)

// EnvConfig 环境变量配置结构体，集中管理所有环境变量
type EnvConfig struct {
	// 数据库配置
	DBPath string // 数据库路径

	// Redis配置
	RedisURL      string // Redis连接地址（host:port）
	RedisPassword string // Redis密码
	RedisDB       int    // Redis数据库编号
	RedisPoolSize int    // Redis连接池大小

	// 应用配置
	AppPort  string // 应用端口
	LogLevel string // 日志级别
	EnvMode  string // 环境模式（dev/test/prod）

	// AI服务配置
	// DoubaoAPIKey  string // 豆包AI API密钥
	// OpenAIAPIKey  string // OpenAI API密钥
	// BaiduAPIKey   string // 百度AI API密钥
	// TencentAPIKey string // 腾讯AI API密钥（预留扩展）
}

// 全局环境配置实例
var Env = &EnvConfig{}

// InitEnv 初始化环境变量，从.env文件加载并解析到EnvConfig
func InitEnv() error {
	// 查找项目根目录
	rootDir, err := FindRootDir()
	if err != nil {
		return fmt.Errorf("查找项目根目录失败: %w", err)
	}

	// 加载.env文件
	envPath := filepath.Join(rootDir, ".env")
	if err := godotenv.Load(envPath); err != nil {
		fmt.Printf("加载.env文件失败: %v\n", err)
		return fmt.Errorf("加载.env文件内容失败: %w", err)
	} else {
		fmt.Println("成功加载.env文件")
	}
	// 解析环境变量到结构体
	if err := parseEnvToConfig(); err != nil {
		return fmt.Errorf("解析环境变量失败: %w", err)
	}
	fmt.Println("袁志华，", Env.AppPort)

	return nil
}

// loadEnvFile 加载指定路径的.env文件
func LoadEnvFile(envPath string) error {
	// 检查文件是否存在
	if _, err := os.Stat(envPath); err != nil {
		if errors.Is(err, os.ErrNotExist) {
			return fmt.Errorf(".env文件不存在: %s", envPath)
		}
		return fmt.Errorf("检查.env文件状态失败: %w", err)
	}

	// 加载.env文件到系统环境变量
	if err := godotenv.Load(envPath); err != nil {
		return fmt.Errorf("加载.env文件内容失败: %w", err)
	}

	return nil
}

// parseEnvToConfig 将环境变量解析到EnvConfig结构体
func parseEnvToConfig() error {
	// 数据库路径
	Env.DBPath = getEnvWithDefault("DB_PATH", "./yuanaiproblem_platform.db")

	// Redis配置（带默认值和类型转换）
	Env.RedisURL = getEnvWithDefault("REDIS_URL", "localhost:6379")
	// 默认为空密码
	Env.RedisPassword = getEnvWithDefault("REDIS_PASSWORD", "")

	redisDB, err := strconv.Atoi(getEnvWithDefault("REDIS_DB", "0"))
	if err != nil {
		return fmt.Errorf("REDIS_DB格式错误，必须是整数: %w", err)
	}
	Env.RedisDB = redisDB

	redisPoolSize, err := strconv.Atoi(getEnvWithDefault("REDIS_POOL_SIZE", "10"))
	if err != nil {
		return fmt.Errorf("REDIS_POOL_SIZE格式错误，必须是整数: %w", err)
	}
	Env.RedisPoolSize = redisPoolSize

	// 应用端口（带默认值和类型转换）
	portStr := getEnvWithDefault("APP_PORT", "8080")

	Env.AppPort = portStr

	// 日志级别（带默认值）
	Env.LogLevel = getEnvWithDefault("LOG_LEVEL", "info")

	// 环境模式（带默认值）
	Env.EnvMode = getEnvWithDefault("ENV_MODE", "dev")

	return nil
}

// getEnvWithDefault 获取环境变量，不存在则返回默认值
func getEnvWithDefault(key, defaultValue string) string {
	value := os.Getenv(key)
	if value == "" {
		return defaultValue
	}
	return value
}

// findRootDir 查找项目根目录（包含 go.mod 的目录）
func FindRootDir() (string, error) {
	dir, err := os.Getwd()
	if err != nil {
		return "", err
	}

	for {
		// 检查当前目录是否包含 go.mod 文件
		if _, err := os.Stat(filepath.Join(dir, "go.mod")); err == nil {
			return dir, nil
		}

		// 向上一级目录移动
		parent := filepath.Dir(dir)
		if parent == dir {
			return "", fmt.Errorf("找不到项目根目录（go.mod 文件不存在）")
		}
		dir = parent
	}
}
